// noinspection JSUnresolvedReference
/**
* Field Google Map
*/
/* global jQuery, document, redux_change, redux, google */
(function ( $ ) {
'use strict';
redux.field_objects = redux.field_objects || {};
redux.field_objects.google_maps = redux.field_objects.google_maps || {};
/* LIBRARY INIT */
redux.field_objects.google_maps.init = function ( selector ) {
if ( ! selector ) {
selector = $( document ).find( '.redux-group-tab:visible' ).find( '.redux-container-google_maps:visible' );
}
$( selector ).each(
function ( i ) {
let delayRender;
const el = $( this );
let parent = el;
if ( ! el.hasClass( 'redux-field-container' ) ) {
parent = el.parents( '.redux-field-container:first' );
}
if ( parent.is( ':hidden' ) ) {
return;
}
if ( parent.hasClass( 'redux-field-init' ) ) {
parent.removeClass( 'redux-field-init' );
} else {
return;
}
// Check for delay render, which is useful for calling a map
// render after JavaScript load.
delayRender = Boolean( el.find( '.redux_framework_google_maps' ).data( 'delay-render' ) );
// API Key button.
redux.field_objects.google_maps.clickHandler( el );
// Init our maps.
redux.field_objects.google_maps.initMap( el, i, delayRender );
}
);
};
/* INIT MAP FUNCTION */
redux.field_objects.google_maps.initMap = async function ( el, idx, delayRender ) {
let delayed;
let scrollWheel;
let streetView;
let mapType;
let address;
let defLat;
let defLong;
let defaultZoom;
let mapOptions;
let geocoder;
let g_autoComplete;
let g_LatLng;
let g_map;
let noLatLng = false;
// Pull the map class.
const mapClass = el.find( '.redux_framework_google_maps' );
const containerID = mapClass.attr( 'id' );
const autocomplete = containerID + '_autocomplete';
const canvas = containerID + '_map_canvas';
const canvasId = $( '#' + canvas );
const latitude = containerID + '_latitude';
const longitude = containerID + '_longitude';
// Add map index to data attr.
// Why, say we want to use delay_render,
// and want to init the map later on.
// You'd need the index number in the
// event of multiple map instances.
// This allows one to retrieve it
// later.
$( mapClass ).attr( 'data-idx', idx );
if ( true === delayRender ) {
return;
}
// Map has been rendered, no need to process again.
if ( $( '#' + containerID ).hasClass( 'rendered' ) ) {
return;
}
// If a map is set to delay render and has been initiated
// from another scrip, add the 'render' class so rendering
// does not occur.
// It messes things up.
delayed = Boolean( mapClass.data( 'delay-render' ) );
if ( true === delayed ) {
mapClass.addClass( 'rendered' );
}
// Create the autocomplete object, restricting the search
// to geographical location types.
g_autoComplete = await google.maps.importLibrary( 'places' );
g_autoComplete = new google.maps.places.Autocomplete( document.getElementById( autocomplete ), {types: ['geocode']} );
// Data bindings.
scrollWheel = Boolean( mapClass.data( 'scroll-wheel' ) );
streetView = Boolean( mapClass.data( 'street-view' ) );
mapType = Boolean( mapClass.data( 'map-type' ) );
address = mapClass.data( 'address' );
address = decodeURIComponent( address );
address = address.trim();
// Set default Lat/lng.
defLat = canvasId.data( 'default-lat' );
defLong = canvasId.data( 'default-long' );
defaultZoom = canvasId.data( 'default-zoom' );
// Eval whether to set maps based on lat/lng or address.
if ( '' !== address ) {
if ( '' === defLat || '' === defLong ) {
noLatLng = true;
}
} else {
noLatLng = false;
}
// Can't have empty values, or the map API will complain.
// Set default for the middle of the United States.
defLat = defLat ? defLat : 39.11676722061108;
defLong = defLong ? defLong : -100.47761000000003;
if ( noLatLng ) {
// If displaying a map based on an address.
geocoder = new google.maps.Geocoder();
// Set up Geocode and pass address.
geocoder.geocode(
{'address': address},
function ( results, status ) {
let latitude;
let longitude;
// Function results.
if ( status === google.maps.GeocoderStatus.OK ) {
// A good address was passed.
g_LatLng = results[0].geometry.location;
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom,
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
// Get and set lat/long data.
latitude = el.find( '#' + containerID + '_latitude' );
latitude.val( results[0].geometry.location.lat() );
longitude = el.find( '#' + containerID + '_longitude' );
longitude.val( results[0].geometry.location.lng() );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
} else {
// No data found, alert the user.
alert( 'Geocode was not successful for the following reason: ' + status );
}
}
);
} else {
// If displaying map based on an lat/lng.
g_LatLng = new google.maps.LatLng( defLat, defLong );
// Set map options.
mapOptions = {
center: g_LatLng,
zoom: defaultZoom, // Start off far unless an item is selected, set by php.
streetViewControl: streetView,
mapTypeControl: mapType,
scrollwheel: scrollWheel,
mapTypeControlOptions: {
style: google.maps.MapTypeControlStyle.HORIZONTAL_BAR,
position: google.maps.ControlPosition.LEFT_BOTTOM
},
mapId: 'REDUX_GOOGLE_MAPS',
};
// Create the map.
g_map = new google.maps.Map( document.getElementById( canvas ), mapOptions );
redux.field_objects.google_maps.renderControls( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID );
}
};
redux.field_objects.google_maps.renderControls = function ( el, latitude, longitude, g_autoComplete, g_map, autocomplete, mapClass, g_LatLng, containerID ) {
let markerTooltip;
let infoWindow;
let g_marker;
let geoAlert = mapClass.data( 'geo-alert' );
// Get HTML.
const input = document.getElementById( autocomplete );
// Set objects into the map.
g_map.controls[google.maps.ControlPosition.TOP_LEFT].push( input );
// Bind objects to the map.
g_autoComplete = new google.maps.places.Autocomplete( input );
g_autoComplete.bindTo( 'bounds', g_map );
// Get the marker tooltip data.
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Create infoWindow.
infoWindow = new google.maps.InfoWindow();
// Create marker.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
draggable: true,
title: markerTooltip,
animation: google.maps.Animation.DROP
}
);
geoAlert = decodeURIComponent( geoAlert );
// Place change.
google.maps.event.addListener(
g_autoComplete,
'place_changed',
function () {
let place;
let address;
let markerTooltip;
infoWindow.close();
// Get place data.
place = g_autoComplete.getPlace();
// Display alert if something went wrong.
if ( ! place.geometry ) {
window.alert( geoAlert );
return;
}
console.log( place.geometry.viewport );
// If the place has a geometry, then present it on a map.
if ( place.geometry.viewport ) {
g_map.fitBounds( place.geometry.viewport );
} else {
g_map.setCenter( place.geometry.location );
g_map.setZoom( 17 ); // Why 17? Because it looks good.
}
markerTooltip = mapClass.data( 'marker-tooltip' );
markerTooltip = decodeURIComponent( markerTooltip );
// Set the marker icon.
g_marker = new google.maps.Marker(
{
position: g_LatLng,
map: g_map,
anchorPoint: new google.maps.Point( 0, - 29 ),
title: markerTooltip,
clickable: true,
draggable: true,
animation: google.maps.Animation.DROP
}
);
// Set marker position and display.
g_marker.setPosition( place.geometry.location );
g_marker.setVisible( true );
// Form array of address components.
address = '';
if ( place.address_components ) {
address = [( place.address_components[0] && place.address_components[0].short_name || '' ),
( place.address_components[1] && place.address_components[1].short_name || '' ),
( place.address_components[2] && place.address_components[2].short_name || '' )].join( ' ' );
}
// Set the default marker info window with address data.
infoWindow.setContent( '
' + place.name + ' ' + address );
infoWindow.open( g_map, g_marker );
// Run Geolocation.
redux.field_objects.google_maps.geoLocate( g_autoComplete );
// Fill in address inputs.
redux.field_objects.google_maps.fillInAddress( el, latitude, longitude, g_autoComplete );
}
);
// Marker drag.
google.maps.event.addListener(
g_marker,
'drag',
function ( event ) {
document.getElementById( latitude ).value = event.latLng.lat();
document.getElementById( longitude ).value = event.latLng.lng();
}
);
// End marker drag.
google.maps.event.addListener(
g_marker,
'dragend',
function () {
redux_change( el.find( '.redux_framework_google_maps' ) );
}
);
// Zoom Changed.
g_map.addListener(
'zoom_changed',
function () {
el.find( '.google_m_zoom_input' ).val( g_map.getZoom() );
}
);
// Marker Info Window.
infoWindow = new google.maps.InfoWindow();
google.maps.event.addListener(
g_marker,
'click',
function () {
const marker_info = containerID + '_marker_info';
const infoValue = document.getElementById( marker_info ).value;
if ( '' !== infoValue ) {
infoWindow.setContent( infoValue );
infoWindow.open( g_map, g_marker );
}
}
);
};
/* FILL IN ADDRESS FUNCTION */
redux.field_objects.google_maps.fillInAddress = function ( el, latitude, longitude, g_autoComplete ) {
// Set variables.
const containerID = el.find( '.redux_framework_google_maps' ).attr( 'id' );
// What if someone only wants city, or state, ect...
// gotta do it this way to check for the address!
// Need to check each of the returned components to see what is returned.
const componentForm = {
street_number: 'short_name',
route: 'long_name',
locality: 'long_name',
administrative_area_level_1: 'short_name',
country: 'long_name',
postal_code: 'short_name'
};
// Get the place details from the autocomplete object.
const place = g_autoComplete.getPlace();
let component;
let i;
let addressType;
let _d_addressType;
let val;
let len;
document.getElementById( latitude ).value = place.geometry.location.lat();
document.getElementById( longitude ).value = place.geometry.location.lng();
for ( component in componentForm ) {
if ( componentForm.hasOwnProperty( component ) ) {
// Push in the dynamic form element ID again.
component = containerID + '_' + component;
// Assign to proper place.
document.getElementById( component ).value = '';
document.getElementById( component ).disabled = false;
}
}
// Get each component of the address from the place details
// and fill the corresponding field on the form.
len = place.address_components.length;
for ( i = 0; i < len; i += 1 ) {
addressType = place.address_components[i].types[0];
if ( componentForm[addressType] ) {
// Push in the dynamic form element ID again.
_d_addressType = containerID + '_' + addressType;
// Get the original.
val = place.address_components[i][componentForm[addressType]];
// Assign to proper place.
document.getElementById( _d_addressType ).value = val;
}
}
};
redux.field_objects.google_maps.geoLocate = function ( g_autoComplete ) {
if ( navigator.geolocation ) {
navigator.geolocation.getCurrentPosition(
function ( position ) {
const geolocation = new google.maps.LatLng( position.coords.latitude, position.coords.longitude );
const circle = new google.maps.Circle(
{
center: geolocation,
radius: position.coords.accuracy
}
);
g_autoComplete.setBounds( circle.getBounds() );
}
);
}
};
/* API BUTTON CLICK HANDLER */
redux.field_objects.google_maps.clickHandler = function ( el ) {
// Find the API Key button and react on click.
el.find( '.google_m_api_key_button' ).on(
'click',
function () {
// Find message wrapper.
const wrapper = el.find( '.google_m_api_key_wrapper' );
if ( wrapper.is( ':visible' ) ) {
// If the wrapper is visible, close it.
wrapper.slideUp(
'fast',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
} else {
// If the wrapper is visible, open it.
wrapper.slideDown(
'medium',
function () {
el.find( '#google_m_api_key_input' ).trigger( 'focus' );
}
);
}
}
);
el.find( '.google_m_autocomplete' ).on(
'keypress',
function ( e ) {
if ( 13 === e.keyCode ) {
e.preventDefault();
}
}
);
// Auto select autocomplete contents,
// since Google doesn't do this inherently.
el.find( '.google_m_autocomplete' ).on(
'click',
function ( e ) {
$( this ).trigger( 'focus' );
$( this ).trigger( 'select' );
e.preventDefault();
}
);
};
} )( jQuery );
Top Địa Chỉ Casino Trực Tuyến Chơi Sòng Bạc Đáng Tin Cậy Nhất Tại Việt Nam – Orchid Group Warning: Undefined variable $encoded_url in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Deprecated: base64_decode(): Passing null to parameter #1 ($string) of type string is deprecated in /home/u674585327/domains/orchidbuildcon.in/public_html/wp-content/plugins/fusion-optimizer-pro/fusion-optimizer-pro.php on line 54
Top địa chỉ casino trực tuyến uy tín cho trò chơi baccarat tại Việt Nam
Đang tìm kiếm Top địa chỉ casino trực tuyến uy tín cho trò chơi Baccarat tại Việt Nam? Hãy tham khảo các địa chỉ dưới đây: 1. W88: Đây là một trong những website casino uy tín nhất tại Việt Nam, cung cấp nhiều bản lẽ và tiện ích cho trò chơi Baccarat.
2. 188Bet: Được biết đến với một môi trường chơi thoải mái và an toàn, 188Bet là một lựa chọn tuyệt vời để chơi Baccarat trực tuyến.
3. Dafabet: Nổi tiếng với các chương trình khuyến mại hấp dẫn, Dafabet cung cấp cho người chơi nhiều lựa chọn cho trò chơi Baccarat.
4. Bet365: Được đánh giá cao về chất lượng dịch vụ và trải nghiệm chơi, Bet365 là một địa chỉ tốt để chơi Baccarat trực tuyến tại parimatch đăng nhập Việt Nam.
5. M88: Với một giao diện trực quan và dễ sử dụng, M88 cung cấp nhiều bản lẽ và cơ hội chơi Baccarat đáng chú ý.
Các địa chỉ casino online đáng tin cậy nhất để chơi baccarat tại Việt Nam
Đang tìm các địa chỉ casino online đáng tin cậy để chơi baccarat tại Việt Nam? Hãy tham khảo 5 địa chỉ dưới đây:
1. W88 – Được đánh giá cao về tính bảo mật và chất lượng dịch vụ.
2. 188Bet – Casino trực tuyến uy tín, cung cấp nhiều mức ưu đãi cho người chơi.
3. M88 – Đội ngũ nhân viên chuyên nghiệp và hỗ trợ trực tuyến 24/7.
4. Dafabet – Rộng lớn về lựa chọn trò chơi và các chương trình khuyến mại hấp dẫn.
5. Bet365 – Trải nghiệm chơi game tuyệt vời với giao diện trực quan và dễ sử dụng.
Những địa chỉ trang web baccarat trực tuyến đáng tin cậy tại Việt Nam
Nếu bạn đang tìm kiếm các địa chỉ trang web baccarat trực tuyến đáng tin cậy tại Việt Nam, hãy xem ngay bên dưới: 1. W88: được đánh giá cao về bảo mật và chất lượng dịch vụ.
2. Fun88: có một trò chơi baccarat trực quan và hấp dẫn.
3. 188Bet: độ bảo mật cao, hỗ trợ nhiều hình thức thanh toán.
4. Dafabet: trang web uy tín, có mục tiêu đem đến trải nghiệm tốt nhất cho người chơi.
5. Bet365: baccarat trực tuyến với phong cách độc đáo, trải nghiệm tuyệt vời.
Top địa chỉ casino trực tuyến cho người chơi baccarat tại Việt Nam
Đang tìm kiếm địa chỉ casino trực tuyến tốt nhất cho trò chơi Baccarat tại Việt Nam? Hãy tham khảo top 5 địa chỉ dưới đây:1. W88: được đánh giá cao về bảo mật và chất lượng dịch vụ.
2. 188Bet: trang web rộng mang đến trải nghiệm tuyệt vời cho người chơi Baccarat.
3. Dafabet: có sự hỗ trợ trực tuyến 24/7 và các chương trình khuyến mại hấp dẫn.
4. M88: độ bảo mật cao và các tính năng tích hợp tiện lợi.
5. Bet365: trang web lớn nhất tại Châu Âu với sự lựa chọn lớn trò chơi Baccarat.
Chúc các bạn chơi game vui vẻ và may mắn!
Các địa chỉ trang web baccarat trực tuyến được kiểm duyệt tại Việt Nam
Đang tìm kiếm các địa chỉ trang web baccarat trực tuyến được kiểm duyệt tại Việt Nam? Hãy tham khảo các website dưới đây: 1. Domain1.vn: Trang web baccarat uy tín, bảo mật với hệ thống kiểm duyệt nghiêm ngặt.
2. Domain2.vn: Giải trí trực tuyến an toàn, chuyên nghiệp với các bản đồ baccarat chính thức.
3. Domain3.vn: Hãy tham gia với sự bảo mật tuyệt đối và dịch vụ tốt nhất tại đây.
4. Domain4.vn: Đảm bảo chất lượng với phong cách trang web đẹp mắt và dễ sử dụng.
5. Domain5.vn: Hãy trải nghiệm cá cược trực tuyến tại Việt Nam với sự hỗ trợ 24/7.
Top địa chỉ casino online uy tín cho trò chơi baccarat tại thị trường Việt Nam
Top địa chỉ casino online uy tín cho trò chơi baccarat tại thị trường Việt Nam bao gồm: 188Bet, Fun88, M88, Dafabet và 1Win. 188Bet nổi tiếng với sự lựa chọn lớn trò chơi và dịch vụ trực tuyến tốt nhất. Fun88 có một trải nghiệm gaming đầy đủ với các tính năng chuyên nghiệp. M88 đảm bảo an toàn với một hệ thống bảo mật cao. Dafabet cung cấp cho người chơi nhiều phương thức thanh toán và nhận tiền giải. 1Win tự hào với một mức độ hỗ trợ khách hàng tốt nhất trong ngành.
Đánh giá tích cực từ khách hàng: Trần Thanh Tùng
Tôi đã chơi sòng bạc ở nhiều địa chỉ trực tuyến khác nhau, nhưng Top Địa Chỉ Casino Trực Tuyến Chơi Sòng Bạc Đáng Tin Cậy Nhất Tại Việt Nam luôn là sự lựa chọn hàng đầu của tôi. Tại đây, tôi đã trải nghiệm những trò chơi đầy màu sắc, chất lượng cao với các tính năng tuyệt vời và dễ sử dụng. Hỗ trợ trực tuyến nhanh chóng và chuyên nghiệp cũng là một điểm nhấn cho dịch vụ tốt hơn. Tôi rất hào hứng để tiếp tục chơi tại đây và khuyên bạn bè của mình cũng nên tham gia cuộc chơi.
Đánh giá tiêu cực từ khách hàng: Lê Thị Hằng
Tôi không thích trải nghiệm của mình tại Top Địa Chỉ Casino Trực Tuyến Chơi Sòng Bạc Đáng Tin Cậy Nhất Tại Việt Nam. Tôi gặp một số vấn đề với quá trình đăng ký và hỗ trợ trực tuyến không đáp ứng yêu cầu của mình. Tôi cũng thấy rằng mức độ bảo mật của trang web cần được cải thiện đáng kể. Tôi khuyên các bạn nên tìm kiếm các tùy chọn khác nếu muốn trải nghiệm trò chơi trực tuyến tốt hơn.
Bạn đang tìm kiếm các địa chỉ casino trực tuyến uy tín để chơi sòng bạc tại Việt Nam?
Hãy troubleshoot bằng các câu hỏi thường gặp về các địa chỉ casino trực tuyến chất lượng nhất cho trò chơi baccarat tại Việt Nam.
Top địa chỉ casino trực tuyến đáng tin cậy nhất cho sòng bạc tại Việt Nam có gì?
Tìm hiểu thêm về các địa chỉ casino trực tuyến uy tín tại Việt Nam với trò chơi baccarat nhé!